package com.bfly.core.context;

/**
 * 对查询结果是否缓存的标志保存到ThreadLocal---主要用在baseService配合使用
 * 默认是缓存
 *
 * @author 长沙商脉科技有限公司
 * @date 2019/6/26 18:43
 */
public class CacheableThreadLocal implements IThreadLocalContext {

    private static CacheableThreadLocal instance;
    private ThreadLocal<Boolean> threadLocal = new ThreadLocal<>();

    private CacheableThreadLocal() {
    }

    private static synchronized CacheableThreadLocal getInstance() {
        if (instance == null) {
            instance = new CacheableThreadLocal();
        }
        return instance;
    }

    /**
     * 设置是否缓存标志到当前线程变量中
     *
     * @author 长沙商脉科技有限公司
     * @date 2018/12/8 9:45
     */
    public static void set(boolean cacheable) {
        getInstance().threadLocal.set(cacheable);
    }

    /**
     * 从当前线程变量中获取缓存标志
     *
     * @author 长沙商脉科技有限公司
     * @date 2018/12/8 9:46
     */
    public static boolean get() {
        return get(false);
    }

    /**
     * 从当前线程变量中获取缓存标志对象,并标识是否移除数据 false表示保留
     *
     * @author 长沙商脉科技有限公司
     * @date 2018/12/8 9:46
     */
    public static boolean get(boolean isRemove) {
        Boolean cacheable = getInstance().getData(getInstance().threadLocal);
        cacheable = cacheable == null ? true : cacheable;   // 默认是缓存
        if (!isRemove) {
            set(cacheable);
        }
        return cacheable;
    }

    /**
     * 清除数据
     *
     * @author 长沙商脉科技有限公司
     * @date 2019/6/27 16:16
     */
    public static void clear() {
        getInstance().threadLocal.remove();
    }
}
